// noinspection JSUnresolvedReference /** * Field Google Map */ /* global jQuery, document, redux_change, redux, google */ (function ( $ ) { 'use strict'; redux.field_objects = redux.field_objects || {}; redux.field_objects.google_maps = redux.field_objects.google_maps || {}; /* LIBRARY INIT */ redux.field_objects.google_maps.init = function ( selector ) { if ( ! selector ) { selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' ); } $( selector ).each( function ( i ) { let delayRender; const el = $( this ); let parent = el; if ( ! el.hasClass( 'redux-field-container' ) ) { parent = el.parents( '.redux-field-container:first' ); } if ( parent.is( ':hidden' ) ) { return; } if ( parent.hasClass( 'redux-field-init' ) ) { parent.removeClass( 'redux-field-init' ); } else { return; } // Check for delay render, which is useful for calling a map // render after JavaScript load. delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) ); // API Key button. redux.field_objects.google_maps.clickHandler( el ); // Init our maps. redux.field_objects.google_maps.initMap( el, i, delayRender ); } ); }; /* INIT MAP FUNCTION */ redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) { let delayed; let scrollWheel; let streetView; let mapType; let address; let defLat; let defLong; let defaultZoom; let mapOptions; let geocoder; let g_autoComplete; let g_LatLng; let g_map; let noLatLng = false; // Pull the map class. const mapClass = el.find( '.redux_framework_google_maps' ); const containerID = mapClass.attr( 'id' ); const autocomplete = containerID + '_autocomplete'; const canvas = containerID + '_map_canvas'; const canvasId = $( '#' + canvas ); const latitude = containerID + '_latitude'; const longitude = containerID + '_longitude'; // Add map index to data attr. // Why, say we want to use delay_render, // and want to init the map later on. // You'd need the index number in the // event of multiple map instances. // This allows one to retrieve it // later. $( mapClass ).attr( 'data-idx', idx ); if ( true === delayRender ) { return; } // Map has been rendered, no need to process again. if ( $( '#' + containerID ).hasClass( 'rendered' ) ) { return; } // If a map is set to delay render and has been initiated // from another scrip, add the 'render' class so rendering // does not occur. // It messes things up. delayed = Boolean( mapClass.data( 'delay-render' ) ); if ( true === delayed ) { mapClass.addClass( 'rendered' ); } // Create the autocomplete object, restricting the search // to geographical location types. g_autoComplete = await google.maps.importLibrary( 'places' ); g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} ); // Data bindings. scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) ); streetView = Boolean( mapClass.data( 'street-view' ) ); mapType = Boolean( mapClass.data( 'map-type' ) ); address = mapClass.data( 'address' ); address = decodeURIComponent( address ); address = address.trim(); // Set default Lat/lng. defLat = canvasId.data( 'default-lat' ); defLong = canvasId.data( 'default-long' ); defaultZoom = canvasId.data( 'default-zoom' ); // Eval whether to set maps based on lat/lng or address. if ( '' !== address ) { if ( '' === defLat || '' === defLong ) { noLatLng = true; } } else { noLatLng = false; } // Can't have empty values, or the map API will complain. // Set default for the middle of the United States. defLat = defLat ? defLat : 39.11676722061108; defLong = defLong ? defLong : -100.47761000000003; if ( noLatLng ) { // If displaying a map based on an address. geocoder = new google.maps.Geocoder(); // Set up Geocode and pass address. geocoder.geocode( {'address': address}, function ( results, status ) { let latitude; let longitude; // Function results. if ( status === google.maps.GeocoderStatus.OK ) { // A good address was passed. g_LatLng = results[0].geometry.location; // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); // Get and set lat/long data. latitude = el.find( '#' + containerID + '_latitude' ); latitude.val( results[0].geometry.location.lat() ); longitude = el.find( '#' + containerID + '_longitude' ); longitude.val( results[0].geometry.location.lng() ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } else { // No data found, alert the user. alert( 'Geocode was not successful for the following reason: ' + status ); } } ); } else { // If displaying map based on an lat/lng. g_LatLng = new google.maps.LatLng( defLat, defLong ); // Set map options. mapOptions = { center: g_LatLng, zoom: defaultZoom, // Start off far unless an item is selected, set by php. streetViewControl: streetView, mapTypeControl: mapType, scrollwheel: scrollWheel, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.LEFT_BOTTOM }, mapId: 'REDUX_GOOGLE_MAPS', }; // Create the map. g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions ); redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ); } }; redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) { let markerTooltip; let infoWindow; let g_marker; let geoAlert = mapClass.data( 'geo-alert' ); // Get HTML. const input = document.getElementById( autocomplete ); // Set objects into the map. g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input ); // Bind objects to the map. g_autoComplete = new google.maps.places.Autocomplete( input ); g_autoComplete.bindTo( 'bounds', g_map ); // Get the marker tooltip data. markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Create infoWindow. infoWindow = new google.maps.InfoWindow(); // Create marker. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), draggable: true, title: markerTooltip, animation: google.maps.Animation.DROP } ); geoAlert = decodeURIComponent( geoAlert ); // Place change. google.maps.event.addListener( g_autoComplete, 'place_changed', function () { let place; let address; let markerTooltip; infoWindow.close(); // Get place data. place = g_autoComplete.getPlace(); // Display alert if something went wrong. if ( ! place.geometry ) { window.alert( geoAlert ); return; } console.log( place.geometry.viewport ); // If the place has a geometry, then present it on a map. if ( place.geometry.viewport ) { g_map.fitBounds( place.geometry.viewport ); } else { g_map.setCenter( place.geometry.location ); g_map.setZoom( 17 ); // Why 17? Because it looks good. } markerTooltip = mapClass.data( 'marker-tooltip' ); markerTooltip = decodeURIComponent( markerTooltip ); // Set the marker icon. g_marker = new google.maps.Marker( { position: g_LatLng, map: g_map, anchorPoint: new google.maps.Point( 0, - 29 ), title: markerTooltip, clickable: true, draggable: true, animation: google.maps.Animation.DROP } ); // Set marker position and display. g_marker.setPosition( place.geometry.location ); g_marker.setVisible( true ); // Form array of address components. address = ''; if ( place.address_components ) { address = [( place.address_components[0] && place.address_components[0].short_name || '' ), ( place.address_components[1] && place.address_components[1].short_name || '' ), ( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' ); } // Set the default marker info window with address data. infoWindow.setContent( '
' + place.name + '
' + address ); infoWindow.open( g_map, g_marker ); // Run Geolocation. redux.field_objects.google_maps.geoLocate( g_autoComplete ); // Fill in address inputs. redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete ); } ); // Marker drag. google.maps.event.addListener( g_marker, 'drag', function ( event ) { document.getElementById( latitude ).value = event.latLng.lat(); document.getElementById( longitude ).value = event.latLng.lng(); } ); // End marker drag. google.maps.event.addListener( g_marker, 'dragend', function () { redux_change( el.find( '.redux_framework_google_maps' ) ); } ); // Zoom Changed. g_map.addListener( 'zoom_changed', function () { el.find( '.google_m_zoom_input' ).val( g_map.getZoom() ); } ); // Marker Info Window. infoWindow = new google.maps.InfoWindow(); google.maps.event.addListener( g_marker, 'click', function () { const marker_info = containerID + '_marker_info'; const infoValue = document.getElementById( marker_info ).value; if ( '' !== infoValue ) { infoWindow.setContent( infoValue ); infoWindow.open( g_map, g_marker ); } } ); }; /* FILL IN ADDRESS FUNCTION */ redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) { // Set variables. const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' ); // What if someone only wants city, or state, ect... // gotta do it this way to check for the address! // Need to check each of the returned components to see what is returned. const componentForm = { street_number: 'short_name', route: 'long_name', locality: 'long_name', administrative_area_level_1: 'short_name', country: 'long_name', postal_code: 'short_name' }; // Get the place details from the autocomplete object. const place = g_autoComplete.getPlace(); let component; let i; let addressType; let _d_addressType; let val; let len; document.getElementById( latitude ).value = place.geometry.location.lat(); document.getElementById( longitude ).value = place.geometry.location.lng(); for ( component in componentForm ) { if ( componentForm.hasOwnProperty( component ) ) { // Push in the dynamic form element ID again. component = containerID + '_' + component; // Assign to proper place. document.getElementById( component ).value = ''; document.getElementById( component ).disabled = false; } } // Get each component of the address from the place details // and fill the corresponding field on the form. len = place.address_components.length; for ( i = 0; i < len; i += 1 ) { addressType = place.address_components[i].types[0]; if ( componentForm[addressType] ) { // Push in the dynamic form element ID again. _d_addressType = containerID + '_' + addressType; // Get the original. val = place.address_components[i][componentForm[addressType]]; // Assign to proper place. document.getElementById( _d_addressType ).value = val; } } }; redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) { if ( navigator.geolocation ) { navigator.geolocation.getCurrentPosition( function ( position ) { const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude ); const circle = new google.maps.Circle( { center: geolocation, radius: position.coords.accuracy } ); g_autoComplete.setBounds( circle.getBounds() ); } ); } }; /* API BUTTON CLICK HANDLER */ redux.field_objects.google_maps.clickHandler = function ( el ) { // Find the API Key button and react on click. el.find( '.google_m_api_key_button' ).on( 'click', function () { // Find message wrapper. const wrapper = el.find( '.google_m_api_key_wrapper' ); if ( wrapper.is( ':visible' ) ) { // If the wrapper is visible, close it. wrapper.slideUp( 'fast', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } else { // If the wrapper is visible, open it. wrapper.slideDown( 'medium', function () { el.find( '#google_m_api_key_input' ).trigger( 'focus' ); } ); } } ); el.find( '.google_m_autocomplete' ).on( 'keypress', function ( e ) { if ( 13 === e.keyCode ) { e.preventDefault(); } } ); // Auto select autocomplete contents, // since Google doesn't do this inherently. el.find( '.google_m_autocomplete' ).on( 'click', function ( e ) { $( this ).trigger( 'focus' ); $( this ).trigger( 'select' ); e.preventDefault(); } ); }; } )( jQuery ); Baxışı – 1win – Interfeysi – Sadəlik və ya Funksionallığın Çatışmazlığı? – Bonus Siyasəti – Həqiqi Dəyər və ya Marketinq Hiyləsi? – Orchid Group
Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54

Baxışı – 1win – Interfeysi – Sadəlik və ya Funksionallığın Çatışmazlığı? – Bonus Siyasəti – Həqiqi Dəyər və ya Marketinq Hiyləsi?

Baxışı – Rəqib Gözü ilə Platformanın Ətraflı İcmalı with 1win

1win platforması Azərbaycan oyunçuları arasında populyarlıq qazanmaqda davam edir. Lakin, bu populyarlıq həqiqətən layiqli əsaslara malikdir, yoxsa sadəcə effektiv marketinqin nəticəsidir? Bu icmalda, rəqib mövqeyindən çıxış edərək, platformanın interfeysindən depozit metodlarına qədər bütün əsas aspektlərini məntiqi yoxlama və mübahisəli suallar verməklə təhlil edəcəyik. Məqsəd, yalnız mənfi cəhətləri deyil, həm də platformanın digər tərəflərini göstərmək və oxucunu öz qərarını verməyə təşviq etməkdir.

1win – Interfeysi – Sadəlik və ya Funksionallığın Çatışmazlığı?

Platformaya ilk daxil olduqda, istifadəçilər parlaq və müasir dizaynla qarşılaşır. Ancaq, rəqib baxımından sual yaranır: bu vizual cəlbedicilik əsas funksiyaların axtarışını asanlaşdırır, yoxsa mürəkkəb struktur onları gizlədir? Əsas menyu aşağıdakı bölmələri özündə birləşdirir:

  • Idman mərcləri – canlı və prematch tədbirlərin geniş spektri.
  • Kazino – slotlar, rulet, blackjack və kart oyunları.
  • TV oyunları – virtual idman tədbirləri.
  • Bonuslar və promosyonlar – cari təkliflərin siyahısı.
  • Kiberidman – populyar e-sports liqaları üzrə mərclər.
  • Çarpayı oyunları – tez nəticələnən lotereya tipli oyunlar.

Bununla belə, bəzi istifadəçi rəyləri qeyd edir ki, ilk dəfə gələnlər üçün bu qədər çox seçim çaşdırıcı ola bilər. 1win-in üstünlüyü ondadır ki, axtarış funksiyası və filtrlər effektiv işləyir, lakin mobil versiyada bəzi elementlər çox kiçik görünə bilər.

Qeydiyyat Prosesi – Sürətli Giriş və ya Təhlükəsizlik Kompromisi?

Platformaya qoşulmaq üçün bir neçə addım lazımdır. Proses sadə görünür, lakin burada tənqidi sual yaranır: bu qədər sürətli qeydiyyat KYC (Müştərinin Kimliyinin Yoxlanılması) tələblərini necə təsir edir? Qeydiyyat üçün əsas üsullar bunlardır:

  1. Telefon nömrəsi ilə qeydiyyat – kodun təsdiqi tələb olunur.
  2. Elektron poçt ünvanı ilə qeydiyyat – şəxsi kabinetə giriş üçün məlumatlar göndərilir.
  3. Sosial şəbəkələr vasitəsilə qeydiyyat – bir kliklə giriş imkanı.

Rəqib perspektivindən baxdıqda, sosial şəbəkələr vasitəsilə qeydiyyat istifadəçi rahatlığı üçün əlavə təhlükəsizlik riskləri daşıya bilər. 1win, qeydiyyatdan dərhal sonra depozit etməyə imkan verir, lakin pul çıxarışı üçün hesabın tam təsdiqi mütləqdir – bu, məntiqli addımdır.

1win

Bonus Siyasəti – Həqiqi Dəyər və ya Marketinq Hiyləsi?

Platforma yeni oyunçulara cəlbedici bonuslar təqdim edir. Lakin, konstruktiv tənqid ondan ibarətdir ki, bu bonusların şərtləri realistikdir, yoxsa onlardan istifadə etmək demək olar ki, mümkün deyil? Ən populyar təkliflərə baxaq:

  • İlk depozit bonusu – depozit məbləğinə 500%-ə qədər artım və ya müəyyən limitdə pulsuz fırlanmalar.
  • Ekspress bonusu – mərc kuponlarının uduzulan hissəsinin müəyyən faizinin qaytarılması.
  • Həftəlik cashback – uduzulan vəsaitin bir hissəsinin geri qaytarılması.
  • Loyalty proqramı – depozitlər və aktivlik üçün xalların yığılması.

Burada əsas məsələ, bonusların əksəriyyətinin mərc tələbləri (wagering requirements) ilə müşayiət olunmasıdır. Məsələn, 500% bonus üçün mərc tələbi çox yüksək ola bilər, bu da onun real dəyərini şübhə altına alır. 1win-in üstünlüyü ondadır ki, bonus şərtləri adətən aydın şəkildə göstərilir, lakin istifadəçinin onları diqqətlə oxuması vacibdir.

1win – də Ödənişlər – Sürət və Etibarlılıq Testi

Depozit və pul çıxarılması üsulları Azərbaycan istifadəçiləri üçün uyğunlaşdırılıb (1 win). Amma sual budur: bütün metodlar eyni dərəcədə sürətli və etibarlıdır? Platforma aşağıdakı ödəniş variantlarını təklif edir:

Metod Depozit Vaxtı Pul Çıxarılma Vaxtı Əsas Xüsusiyyət
Bank Kartları (Visa/Mastercard) Dərhal 1-3 bank günü Ən geniş yayılmış üsul
Elektron Pul Kisələri (Crypto, Advcash) Dərhal 24 saat ərzində Anonimliyə yaxın sürət
Mobil Ödənişlər Dərhal Mümkün deyil Yalnız depozit üçün
Kriptovalyuta Dərhal Bir neçə saat Məhdud sayda valyuta
Bank Köçürməsi 1-5 bank günü 3-7 bank günü Yüksək məbləğlər üçün

Rəqib baxışı ilə desək, pul çıxarılması üçün 1-3 bank günü müasir standartlara uyğun gəlir, lakin bəzi rəqiblər daha sürətli, hətta dərhal ödənişlər təklif edir. 1win-in 1 win platformasında minimal depozit məbləği adətən 15 AZN, minimal çıxarış məbləği isə 30 AZN təşkil edir ki, bu da orta səviyyəli oyunçu üçün əlçatandır.

1win – Təhlükəsizlik və KYC – İnanc və ya Narahatlıq Səbəbi?

Hər hansı bir onlayn platformada təhlükəsizlik əsas amildir. 1win, SSL şifrələməsi və lisenziyalı fəaliyyət barədə iddialar irəli sürür. Lakin, konstruktiv tənqid ondan ibarətdir ki, bu tədbirlər kifayətdirmi? KYC prosesi zamanı istifadəçilərdən aşağıdakı sənədlər tələb oluna bilər:

  • Şəxsiyyət vəsiqəsinin və ya pasportun skanı.
  • Yaşama yerini təsdiq edən sənəd (kommunal ödəniş qəbzi).
  • İstifadə olunan ödəniş kartının və ya hesabın fotosu (gizli məlumatlar örtülü).

Bu proses bəzi istifadəçilər tərəfindən narahatlıq doğura bilər, lakin beynəlxalq standartlara cavab verir. Əks tərəfi göstərmək lazımdır ki, lisenziya məsələsi həmişə aydın deyil – platforma Kurakao lisenziyası əsasında fəaliyyət göstərir, bu isə bəzi ölkələrdə tam tanınmır.

1win

Dəstək Xidməti – Effektiv Yardım və ya Formal Cavablar?

Texniki problemlər və ya suallar yarananda dəstək xidmətinə müraciət etmək lazım gəlir. 1win bir neçə kanal təklif edir: canlı söhbət, elektron poçt və Telegram bot. Lakin, rəylər qeyd edir ki, cavab vaxtı və məsuliyyət dərəcəsi dəyişə bilər. Dəstək komandası əsasən Azərbaycan dilində də xidmət göstərir ki, bu da lokal auditoriya üçün böyük üstünlükdür. Tənqidi baxışdan, canlı söhbət ən sürətli variantdır, lakin mürəkkəb məsələlərdə həll bir neçə gün çəkə bilər.

Mobil Tətbiqi – Rahatlıq və ya Məhdud Funksionallıq?

Platformanın mobil tətbiqi həm Android, həm də iOS üçün mövcuddur. Tətbiq əsas veb-saytın funksionallığını təkrarlayır, lakin sual budur: bu, tam hüquqlu bir təcrübədir, yoxsa kompromis variantdır? Tətbiqin üstünlükləri arasında bildirişlər, sürətli giriş və optimallaşdırılmış interfeys var. Çatışmazlıqları isə bəzi bölmələrin daha yavaş işləməsi və böyük yeniləmələr üçün daimi internet tələbi ola bilər. Rəqib perspektivindən, bir çox rəqib tətbiqləri də oxşar funksionallıq təklif edir, ona görə də 1win burada heç bir inqilabi yenilik təqdim etmir.

Ümumilikdə, 1win platforması Azərbaycan bazarı üçün uyğunlaşdırılmış geniş funksionallıq və ödəniş variantları təqdim edir. Lakin, istifadəçi hər bir aspekti – bonus şərtlərindən KYC prosesinə qədər – diqqətlə qiymətləndirməlidir. Platformanın güclü tərəfləri onun lokal uyğunluğu və vizual interfeysidir, zəif tərəfləri isə bəzi rəqiblərlə müqayisədə orta səviyyəli pul çıxarılma müddətləri və mürəkkəb bonus tələbləri ola bilər. Son qərar istifadəçinin şəxsi prioritetlərindən asılıdır: maksimum bonuslar, ən sürətli ödənişlər və ya ən sadə interfeys.

Design and Develop by Ovatheme